package br.com.divulgaqui.service;

import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.logging.Logger;

import br.com.divulgaqui.client.PessoaJuridicaServiceBeanLocal;
import br.com.divulgaqui.client.PessoaJuridicaServiceBeanRemote;
import br.com.divulgaqui.client.PessoaServiceBeanRemote;
import br.com.divulgaqui.client.exception.CNPJIgualException;
import br.com.divulgaqui.client.exception.EmailIgualException;
import br.com.divulgaqui.entity.Endereco;
import br.com.divulgaqui.entity.PessoaJuridica;
import br.com.divulgaqui.entity.Telefone;
import br.com.divulgaqui.persistence.dao.EnderecoDAO;
import br.com.divulgaqui.persistence.dao.PessoaJuridicaDAO;
import br.com.divulgaqui.persistence.dao.TelefoneDAO;
import br.com.divulgaqui.persistence.daoimpl.EnderecoDAOimpl;
import br.com.divulgaqui.persistence.daoimpl.PessoaJuridicaDAOImpl;
import br.com.divulgaqui.persistence.daoimpl.TelefoneDAOimpl;

/**
 * Session Bean implementation class PessoaJuridicaServiceBean
 */
@Stateless
public class PessoaJuridicaServiceBean extends PessoaServiceBean implements PessoaServiceBeanRemote, PessoaJuridicaServiceBeanLocal, PessoaJuridicaServiceBeanRemote {

	@PersistenceContext(unitName="divulgaqui")
	private EntityManager entityManager;
	private PessoaJuridicaDAO pessoaJuridicaDAO;
	private TelefoneDAO telefoneDAO;
	private EnderecoDAO enderecoDAO;
	private Logger logg = Logger.getLogger(PessoaJuridicaServiceBean.class);

	/**
	 * Default constructor.
	 */
	public PessoaJuridicaServiceBean() {

	}

	@PostConstruct
	public void init() {
		super.init();
		pessoaJuridicaDAO = new PessoaJuridicaDAOImpl(this.entityManager);
		telefoneDAO = new TelefoneDAOimpl(this.entityManager);
    	enderecoDAO = new EnderecoDAOimpl(this.entityManager);
    }

	@Override
	public void salvar(PessoaJuridica pessoaJuridica)throws EmailIgualException, CNPJIgualException {
		validaPessoaJuridica(pessoaJuridica);
		pessoaJuridica.setCnpj(pessoaJuridica.getCnpj().replace("-", "").replace(".", "").replace("/", "").trim());
		pessoaJuridica.setEmail(pessoaJuridica.getEmail().toLowerCase());
		List<Telefone> tels = pessoaJuridica.getTelefones();
		Set<Endereco> ends = pessoaJuridica.getEnderecos();
		pessoaJuridicaDAO.salvar(pessoaJuridica);
		pessoaJuridica = pessoaJuridicaDAO.getPessoaJuridicaByCNPJ(pessoaJuridica.getCnpj());
		if (tels != null && !tels.isEmpty()) {
			for (Telefone tel : tels) {
				tel.setPessoa(pessoaJuridica);
				telefoneDAO.salvar(tel);
			}
		}
		if (ends != null && !ends.isEmpty()) {
			for (Endereco end : ends) {
				end.setPessoa(pessoaJuridica);
				enderecoDAO.salvar(end);
			}
		}
		logg.debug("Pessoa Física '" + pessoaJuridica.getNome() + "' salva");
		pessoaJuridicaDAO.salvar(pessoaJuridica);
	}
	
	protected void validaPessoaJuridica(PessoaJuridica pessoaJuridica) throws EmailIgualException, CNPJIgualException{
		super.validaPessoa(pessoaJuridica);
		PessoaJuridica pessoaJuridicaIgual = pessoaJuridicaDAO.getPessoaJuridicaByCNPJ(pessoaJuridica.getCnpj());
		if(pessoaJuridicaIgual != null && !pessoaJuridica.getId().equals(pessoaJuridicaIgual.getId())){
			logg.warn("CNPJ \""+pessoaJuridica.getCnpj()+"\" já cadastrado.");
			throw new CNPJIgualException();
		}
	}
}
